package interview.huawei.tjt.training.dongtaiguihua;

import java.util.Scanner;

/**
 * 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额，返回 -1。
 *
 * 你可以认为每种硬币的数量是无限的。
 *
 * 示例 1： 输入：coins = [1,2,5], amount = 11 输出：3 解释：11 = 5 + 5 + 1
 *
 * 示例 2： 输入：coins = [2], amount = 3 输出：-1
 *
 * 示例 3： 输入：coins = [1], amount = 0 输出：0
 *
 * 示例 4： 输入：coins = [1], amount = 1 输出：1
 *
 * 示例 5： 输入：coins = [1], amount = 2 输出：2
 *
 * 提示：
 *
 * 1 <= coins.length <= 12
 * 1 <= coins[i] <= 2^31 - 1
 * 0 <= amount <= 10^4
 */
public class CoinChange {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strings = sc.nextLine().split(",");
        int amount = sc.nextInt();
        int[] coins = new int[strings.length];
        for (int i = 0; i < strings.length; i ++) {
            if (!strings[i].equals("")) {
                coins[i] = Integer.parseInt(strings[i]);
            }
        }
        int[] dp = new int[amount + 1];
        //初始化dp数组为最大值
        for (int j = 0; j < dp.length; j++) {
            dp[j] = Integer.MAX_VALUE;
        }
        dp[0] = 0;

        for (int i = 0; i < coins.length; i ++) {
            // 从前往后遍历的话coins里面的元素可以用多次
            for (int j = coins[i]; j <= amount; j ++) {
                if (dp[j - coins[i]] != Integer.MAX_VALUE) {
                    //选择硬币数目最小的情况
                    dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
                }
            }
        }
        System.out.println(dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount]);
    }

}
